import type {AxiosInstance, AxiosRequestConfig, AxiosResponse} from "axios";
import axios from "axios";
import { message } from "ant-design-vue";
// import router from "@/router";

// export const baseURL = 'http://43.139.30.127:7003';
export const baseURL = 'https://stock.mssdk.vip/portal';

export interface Result<T = any> {
    code: number;
    message: string;
    data: T;
}

//获取token
export const getToken = () => {
    return localStorage.getItem('persist:userInfo') && JSON.parse(JSON.parse((localStorage as any).getItem('persist:userInfo')).userInfo).token
}

class Request {
    // axios 实例
    instance: AxiosInstance;
    // 基础配置，url和超时时间
    baseConfig: AxiosRequestConfig = {baseURL: baseURL, timeout: 5000};

    constructor(config: AxiosRequestConfig) {
        // 使用axios.create创建axios实例
        this.instance = axios.create(Object.assign(this.baseConfig, config));
        //请求拦截器
        this.instance.interceptors.request.use((res) => {
            const token = getToken()
            if (token) {
                res.headers!.token = token
            }
            return res
        }, (err: any) => err)
        //响应拦截器
        this.instance.interceptors.response.use(
            (res: AxiosResponse) => {
                if (res.data.code !== 200) {
                    message.error(res.data.msg)
                    return Promise.reject(res.data.data);
                }
                return Promise.resolve(res.data.data);
            },
            (err: any) => {
                let message: string;
                // 这里是AxiosError类型，所以一般我们只reject我们需要的响应即可
                return Promise.reject(err.response);
            }
        );
    }

    public request<R>(config: AxiosRequestConfig): Promise<Result<R>> {
        return this.instance.request(config);
    }

    /**
     * 简单的Get请求。如果需要带参，通过{@link config}传入params或data
     * @param url 请求接口的url
     * @param config 本次请求的额外配置
     * @return 一个泛型T
     */
    public get<T = any>(url: string, params?: any, config?: AxiosRequestConfig): Promise<T> {
        return this.instance.get(url, {params: params, ...config});
    }

    /**
     * 简单的Post请求。如果需要带参，通过{@link data}传入请求体数据，或{@link config}传入params或data
     * @param url 请求接口的url
     * @param data 请求体数据
     * @param config 本次请求的额外配置
     * @return 一个泛型T
     */
    public post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
        return this.instance.post(url, {...data}, {...config});
    }

    /**
     * 简单的Put请求。如果需要带参，通过{@link data}传入请求体数据，或{@link config}传入params或data
     * @param url 请求接口的url
     * @param data 请求体数据
     * @param config 本次请求的额外配置
     * @return 一个{@link Promise}，大部分情况下它是{@link Result}，如果传入了K泛型，则额外包括K
     */
    public put<T = any, R = any, K = any>(
        url: string,
        data?: T,
        config?: AxiosRequestConfig
    ): Promise<Result<R> & K> {
        return this.instance.put(url, data, config);
    }

    /**
     * 简单的Delete请求。如果需要带参，通过{@link config}传入params或data
     * @param url 请求接口的url
     * @param config 本次请求的额外配置
     * @return 一个{@link Promise}，大部分情况下它是{@link Result}，如果传入了K泛型，则额外包括K
     */

    public delete<R = any, K = any>(
        url: string,
        config?: AxiosRequestConfig
    ): Promise<Result<R> & K> {
        return this.instance.delete(url, config);
    }
}


export default new Request({});
